{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 从高维数据向低维数据的映射"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.empty((100,2))\n",
    "X[:,0] = np.random.uniform(0., 100., size=100)\n",
    "X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0, 10., size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(n_components=2)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from playML.PCA import PCA\n",
    "\n",
    "pca = PCA(n_components=2)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.76331029,  0.64603205],\n       [-0.64602747,  0.76331416]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(n_components=1)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=1)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_reduction = pca.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 变为只有1个特征了\n",
    "X_reduction.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 恢复成2维会是怎样呢\n",
    "X_restore = pca.inverse_transform(X_reduction)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "原来的数据样本与降维后再恢复的样本点放在一起看看"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x106384710>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0],X[:,1], color='b', alpha=0.5)\n",
    "plt.scatter(X_restore[:,0], X_restore[:,1], color='r', alpha=0.5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## scikit-learn中的PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=1, random_state=None,\n  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.decomposition.pca import PCA\n",
    "pca = PCA(n_components=1)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.76331024,  0.64603211]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_reduction = pca.transform(X)\n",
    "X_reduction.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 2)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_restore = pca.inverse_transform(X_reduction)\n",
    "X_restore.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x108eacf98>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0],X[:,1], color='b', alpha=0.5)\n",
    "plt.scatter(X_restore[:,0], X_restore[:,1], color='r', alpha=0.5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
